home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / unixSyscall / stat.c < prev    next >
C/C++ Source or Header  |  1990-03-23  |  7KB  |  244 lines

  1. /* 
  2.  * stat.c --
  3.  *
  4.  *    Procedure to map from Unix *stat system calls to Sprite.
  5.  *
  6.  * Copyright 1986 Regents of the University of California
  7.  * All rights reserved.
  8.  */
  9.  
  10. #ifndef lint
  11. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/stat.c,v 1.6 89/11/20 12:57:52 mendel Exp $ SPRITE (Berkeley)";
  12. #endif not lint
  13.  
  14. #include "sprite.h"
  15. #include "fs.h"
  16. #include "compatInt.h"
  17.  
  18. #include <sys/types.h>
  19. #include <sys/stat.h>
  20.  
  21. static int CvtSpriteToUnixType();
  22.  
  23.  
  24. /*
  25.  *----------------------------------------------------------------------
  26.  *
  27.  * CvtSpriteToUnixAtts --
  28.  *
  29.  *    Procedure to convert the Sprite file system attributes 
  30.  *    structure to the Unix format.
  31.  *
  32.  * Results:
  33.  *    none.
  34.  *
  35.  * Side effects:
  36.  *     none.
  37.  *
  38.  *----------------------------------------------------------------------
  39.  */
  40.  
  41. static void
  42. CvtSpriteToUnixAtts(spriteAttsPtr, unixAttsPtr)
  43.     register    struct stat    *unixAttsPtr;
  44.     register    Fs_Attributes    *spriteAttsPtr;
  45. {
  46.     unixAttsPtr->st_dev        = spriteAttsPtr->domain;
  47.     unixAttsPtr->st_ino        = spriteAttsPtr->fileNumber;
  48.     unixAttsPtr->st_mode    = (spriteAttsPtr->permissions & 0xfff) |
  49.                     CvtSpriteToUnixType(spriteAttsPtr->type);
  50.     unixAttsPtr->st_nlink    = spriteAttsPtr->numLinks;
  51.     unixAttsPtr->st_uid        = spriteAttsPtr->uid;
  52.     unixAttsPtr->st_gid        = spriteAttsPtr->gid;
  53.     unixAttsPtr->st_rdev    = (spriteAttsPtr->devType << 8) |
  54.                   (spriteAttsPtr->devUnit & 0xff);
  55.     unixAttsPtr->st_size    = spriteAttsPtr->size;
  56.     unixAttsPtr->st_blksize    = spriteAttsPtr->blockSize;
  57.     unixAttsPtr->st_blocks    = spriteAttsPtr->blocks * 2;
  58.     unixAttsPtr->st_atime    = spriteAttsPtr->accessTime.seconds;
  59.     unixAttsPtr->st_spare1    = 0;
  60.     unixAttsPtr->st_mtime    = spriteAttsPtr->dataModifyTime.seconds;
  61.     unixAttsPtr->st_spare2    = 0;
  62.     unixAttsPtr->st_ctime    = spriteAttsPtr->descModifyTime.seconds;
  63.     unixAttsPtr->st_spare3    = 0;
  64.     unixAttsPtr->st_serverID    = spriteAttsPtr->serverID;
  65.     unixAttsPtr->st_version    = spriteAttsPtr->version;
  66.     unixAttsPtr->st_userType    = spriteAttsPtr->userType;
  67.     unixAttsPtr->st_devServerID = spriteAttsPtr->devServerID;
  68. }
  69.  
  70. /*
  71.  *----------------------------------------------------------------------
  72.  *
  73.  * CvtSpriteToUnixType --
  74.  *
  75.  *    Convert from Sprite file types to the IFMT mode bits of a unix file
  76.  *
  77.  * Results:
  78.  *    Unix file type bits.
  79.  *
  80.  * Side effects:
  81.  *     none.
  82.  *
  83.  *----------------------------------------------------------------------
  84.  */
  85.  
  86. static int
  87. CvtSpriteToUnixType(spriteFileType)
  88.     register    int spriteFileType;
  89. {
  90.     register unixModeBits;
  91.  
  92.     switch (spriteFileType) {
  93.     default:
  94.     case FS_FILE:
  95.         unixModeBits = S_IFREG;
  96.         break;
  97.     case FS_DIRECTORY:
  98.         unixModeBits = S_IFDIR;
  99.         break;
  100.     case FS_SYMBOLIC_LINK:
  101.         unixModeBits = S_IFLNK;
  102.         break;
  103.     case FS_DEVICE:
  104.     case FS_REMOTE_DEVICE:        /* not used */
  105.         unixModeBits = S_IFCHR;
  106.         break;
  107.     case FS_LOCAL_PIPE:        /* not used */
  108.     case FS_NAMED_PIPE:
  109.         unixModeBits = S_IFIFO;
  110.         break;
  111.     case FS_REMOTE_LINK:
  112.         unixModeBits = S_IFRLNK;
  113.         break;
  114.     case FS_PSEUDO_DEV:
  115.         unixModeBits = S_IFPDEV;
  116.         break;
  117.     }
  118.     return(unixModeBits);
  119. }
  120.  
  121.  
  122. /*
  123.  *----------------------------------------------------------------------
  124.  *
  125.  * stat --
  126.  *
  127.  *    Procedure to map from Unix stat system call to Sprite
  128.  *    Fs_GetAttributes.  
  129.  *
  130.  * Results:
  131.  *    UNIX_SUCCESS     - the call was successful.
  132.  *    UNIX_ERROR     - the call was not successful. 
  133.  *              The actual error code stored in errno.  
  134.  *
  135.  * Side effects:
  136.  *    The attributes of the specified file are stored in *attsBufPtr.
  137.  *    Errno may be modified.
  138.  *
  139.  *----------------------------------------------------------------------
  140.  */
  141.  
  142. int
  143. stat(pathName, attsBufPtr)
  144.     char *pathName;        /* The name of the file to stat */
  145.     struct stat *attsBufPtr;    /* ptr to buffer to hold attributes in 
  146.                    Unix format */
  147. {
  148.     ReturnStatus     status;    /* status returned by Fs_GetAttributes */
  149.     Fs_Attributes    spriteAtts;    /* buffer for attributes using
  150.                        Sprite format. */
  151.  
  152.     status = Fs_GetAttributes(pathName, FS_ATTRIB_FILE, &spriteAtts);
  153.     if (status != SUCCESS) {
  154.     errno = Compat_MapCode(status);
  155.     return(UNIX_ERROR);
  156.     } else {
  157.     CvtSpriteToUnixAtts(&spriteAtts, attsBufPtr);
  158.     return(UNIX_SUCCESS);
  159.     }
  160. }
  161.  
  162.  
  163. /*
  164.  *----------------------------------------------------------------------
  165.  *
  166.  * lstat --
  167.  *
  168.  *    Procedure to map from Unix lstat system call to Sprite
  169.  *    Fs_GetAttributes.  If the file specified is a symbolic link,
  170.  *    follow the link and perform Fs_GetAttributes again.
  171.  *
  172.  * Results:
  173.  *    UNIX_SUCCESS     - the call was successful.
  174.  *    UNIX_ERROR     - the call was not successful. 
  175.  *              The actual error code stored in errno.  
  176.  *
  177.  * Side effects:
  178.  *    The attributes of the specified file are stored in *attsBufPtr.
  179.  *    Errno may be modified.
  180.  *
  181.  *----------------------------------------------------------------------
  182.  */
  183.  
  184. int
  185. lstat(pathName, attsBufPtr)
  186.     char *pathName;        /* The name of the file to stat */
  187.     struct stat *attsBufPtr;    /* ptr to buffer to hold attributes in 
  188.                    Unix format */
  189. {
  190.     ReturnStatus     status;    /* status returned by Fs_GetAttributes */
  191.     Fs_Attributes    spriteAtts;    /* buffer for attributes using
  192.                        Sprite format. */
  193.  
  194.     status = Fs_GetAttributes(pathName, FS_ATTRIB_LINK, &spriteAtts);
  195.     if (status != SUCCESS) {
  196.     errno = Compat_MapCode(status);
  197.     return(UNIX_ERROR);
  198.     } else {
  199.     CvtSpriteToUnixAtts(&spriteAtts, attsBufPtr);
  200.     return(UNIX_SUCCESS);
  201.     }
  202. }
  203.  
  204.  
  205. /*
  206.  *----------------------------------------------------------------------
  207.  *
  208.  * fstat --
  209.  *
  210.  *    Procedure to map from Unix fstat system call to Sprite
  211.  *    Fs_GetAttributesID.  
  212.  *
  213.  * Results:
  214.  *    UNIX_SUCCESS     - the call was successful.
  215.  *    UNIX_ERROR     - the call was not successful. 
  216.  *              The actual error code stored in errno.  
  217.  *
  218.  * Side effects:
  219.  *    The attributes of the specified file are stored in *attsBufPtr.
  220.  *    Errno may be modified.
  221.  *
  222.  *----------------------------------------------------------------------
  223.  */
  224.  
  225. int
  226. fstat(fd, attsBufPtr)
  227.     int fd;            /* Descriptor for file to stat */
  228.     struct stat *attsBufPtr;    /* ptr to buffer to hold attributes in 
  229.                    Unix format */
  230. {
  231.     ReturnStatus     status;    /* status returned by Fs_GetAttributesID */
  232.     Fs_Attributes    spriteAtts;    /* buffer for attributes using
  233.                        Sprite format. */
  234.  
  235.     status = Fs_GetAttributesID(fd,  &spriteAtts);
  236.     if (status != SUCCESS) {
  237.     errno = Compat_MapCode(status);
  238.     return(UNIX_ERROR);
  239.     } else {
  240.     CvtSpriteToUnixAtts(&spriteAtts, attsBufPtr);
  241.     return(UNIX_SUCCESS);
  242.     }
  243. }
  244.